/**
 *   插件功能： 自动设置提醒订单数量， 用作layui-admin框架使用。
 *   使用步骤：
 *
 *   0. layout页面头部的 ul标签需要添加ID = LAYOUT_TOP_UL
 *
 *   1. 导入组件： autoQueryAndPlayTask
 *
 *   编写代码：
 *   autoQueryAndPlayTask.addTipsItem("自定义名称，与ajax返回的key一致", "显示标题", "跳转路径", 开启声音标志, mp3路径, mp3播放时间); //添加一个控件
 *   ... 可添加多个
 *   autoQueryAndPlayTask.start("轮询请求地址", "定时任务间隔，默认10s"); //开启
 *
 *   注意： 轮询查询ajax结果请务必按照： 如下格式返回：
 *   请求参数 ： （字符串类型， 后台需做反序列化处理）
 *   reqDataStr: [{"name":"payOrderCount","queryTime":"2020-12-02 15:43:50"},{"name":"supRechargeOrderCount","queryTime":"2020-12-02 15:43:51"},{"name":"agpayRechargeOrderCount","queryTime":"2020-12-02 15:43:52"},{"name":"settOrderCount","queryTime":"2020-12-02 15:43:32"}]
 *
 *   {
		"agpayRechargeOrderCount" : 0,  //key 与自定义名称一致, v=数量
		"supRechargeOrderCount" : 0,
		"settOrderCount" : 0,
		"payOrderCount" : 0
 *   }
 *
 * **/
layui.define(['admin', 'util'], function(exports){
	var $ = layui.$
		,admin = layui.admin
		,util = layui.util;

	var obj = {

		allTipsCtrlMap : {}, //所有的系统提示控制器map集合
		queryURL: "", //设置定时任务查询的url地址
		taskTime: 10, //定时任务时间， 默认10s

		//添加一个提示组件 Item
		addTipsItem: function (name, title, toHref, setPlaySoundFlag, mp3Url, time){

			let globalThis = this;

			let audioObject = null;
			if(setPlaySoundFlag){ //系统设置不播放提示音
				audioObject = new Audio(mp3Url);
				audioObject.muted = true; //默认静音
			}

			globalThis.allTipsCtrlMap[name] = {
				name: name,   //定义一个名称， 务必与后台返回的key一致， 否则将导致无法正确匹配。 ex: payOrderCount
				title: title, //标题， 如： 支付订单， 充值订单
				toHref: toHref,  //点击标题的
				currentCount: 0, //当前订单数量， 用于控制是否播放提示音
				setPlaySoundFlag: setPlaySoundFlag, //系统配置播放声音开关
				audioObject: audioObject,   //Audio对象
				isPlaying: false,  //是否播放中
				time: time,  //播放时间， 用于控制，如播放提示音时发现正在播放则不再重新播放。  播放时通过settimeout切换是否播放中的状态。   单位： 秒
				queryTimeStr: util.toDateString(new Date()), //查询时间，默认为当前时间
				tryPlay: function(muted = false){   //尝试播放, 默认非静音播放

					//允许播放提示音 && 声音对象不为空 && 当前不是播放中状态 && 用户手动点击了允许提示音
					if(this.setPlaySoundFlag && this.audioObject && !this.isPlaying && $("#LAYOUT_TOP_openAudioBtn").attr('userAllowPlayFlag') == 'true'){
						this.audioObject.muted = muted;
						this.audioObject.play();  //播放

						if(!muted){ //正常播放
							this.isPlaying = true;
							let that = this;
							setTimeout(function(){ that.isPlaying = false;}, this.time * 1000); //播放完成后更改为 未播放中状态
						}

					}
				},
				setMuted:function(muted){ //设置是否静音
					if(this.audioObject){
						this.audioObject.muted = muted;
					}
				},
				updateCount: function(countNum){ //更新数量
					this.currentCount = countNum;
					$(`#LAYOUT_TOP_UL_ITEM_${this.name}`).find('.LAYOUT_ORDER_COUNT_SPAN').text(countNum);
				},
				resetCountAndTime: function(){ //一般用于点击标签后出发
					this.updateCount(0);
					this.queryTimeStr = util.toDateString(new Date());
				}
			}

			//初始化 页面数量
			$("#LAYOUT_TOP_UL").append(`
              <li id="LAYOUT_TOP_UL_ITEM_${name}" class="layui-nav-item" lay-unselect style="cursor: pointer;">
                    ${title}<span class="layui-badge LAYOUT_ORDER_COUNT_SPAN">0</span>
              </li>
    		`);

			//点击事件
			$(`#LAYOUT_TOP_UL_ITEM_${name}`).click(function(){
				globalThis.allTipsCtrlMap[name].resetCountAndTime();
				location.href = layui.setter.baseLocal + toHref;
			});

		},

		//开启 定时查询任务
		start: function(queryURL, taskTime){

			if(typeof($queryNewOrderSetTimeOutTaskID) != "undefined"){
				window.clearTimeout($queryNewOrderSetTimeOutTaskID);
			}

			let globalThis = this;

			globalThis.queryURL = queryURL;
			globalThis.taskTime = taskTime;

			//不存在任何对象，无需做任何处理
			if(Object.keys(globalThis.allTipsCtrlMap).length <= 0){
				return false;
			}

			let showSoundCtrl = false; //是否显示声音的控制开关（全局， 用于用户手动点击）
			$.each(globalThis.allTipsCtrlMap, function(kName){
				if(globalThis.allTipsCtrlMap[kName].setPlaySoundFlag){
					showSoundCtrl = true;
					return false; //不在遍历
				}
			});

			if(showSoundCtrl){ //显示全局提示音开关

				$("#LAYOUT_TOP_UL").append(`
					   <li class="layui-nav-item" lay-unselect>
						  <a id="LAYOUT_TOP_openAudioBtn" userAllowPlayFlag="false" href="javascript:;" title="提示音">提示音：<i class="layui-icon layui-icon-about"></i>已关闭</a>
						  <a id="LAYOUT_TOP_closeAudioBtn" class="layui-hide" href="javascript:;" title="提示音">提示音：<i class="layui-icon layui-icon-speaker"></i>已开启</a>
					  </li>
            	`);

				//绑定点击事件
				$("#LAYOUT_TOP_openAudioBtn").click(function(){

					$("#LAYOUT_TOP_openAudioBtn").addClass('layui-hide').attr('userAllowPlayFlag', "true");
					$("#LAYOUT_TOP_closeAudioBtn").removeClass('layui-hide');

					//全部音频 静音播放一次
					$.each(globalThis.allTipsCtrlMap, function(kName){
						globalThis.allTipsCtrlMap[kName].tryPlay(true);
					});

				});

				//绑定点击事件
				$("#LAYOUT_TOP_closeAudioBtn").click(function(){

					$("#LAYOUT_TOP_closeAudioBtn").addClass('layui-hide');
					$("#LAYOUT_TOP_openAudioBtn").removeClass('layui-hide').attr('userAllowPlayFlag', "false");

					//全部音频 设置为静音
					$.each(globalThis.allTipsCtrlMap, function(kName){
						globalThis.allTipsCtrlMap[kName].setMuted(true);
					});
				});
			}

			//执行查询任务
			globalThis.selectNewOrderTaskFunc();
		},

		//查询定时任务
		selectNewOrderTaskFunc: function() {

			let globalThis = this;

			//确保是当前页面， 如退出后不应该再次查询
			if( $("#LAYOUT_TOP_UL").length <= 0 ){
				if(typeof($queryNewOrderSetTimeOutTaskID) != 'undefined'){
					window.clearTimeout($queryNewOrderSetTimeOutTaskID);
				}
				return false;
			}

			let reqData = [];
			$.each(globalThis.allTipsCtrlMap, function(kName){
				reqData.push({name: kName, queryTime: globalThis.allTipsCtrlMap[kName].queryTimeStr});
			});

			admin.req({
				type: 'get',
				url: layui.setter.baseUrl + globalThis.queryURL,
				data : { reqDataStr: JSON.stringify(reqData) },
				error: function(err){},
				success: function(res){
					if(res.code == 0){

						$.each(res.data, function(kName){

							let thisCount = res.data[kName];
							let thisCtrl = globalThis.allTipsCtrlMap[kName];

							//尝试播放提示音
							if(thisCount > thisCtrl.currentCount){
								thisCtrl.tryPlay(); //尝试播放提示音
							}

							thisCtrl.updateCount(thisCount); //更新数量
						});

					}
				},
				complete: function(){ //无论成功失败， 都再次调用查询函数

					//xx s后再次查询
					//这里定义一个Window的全局变量
					$queryNewOrderSetTimeOutTaskID = setTimeout(function(){   //这里不能直接使用： globalThis.selectNewOrderTaskFunc() , 需要写一个函数，否则this将指向Window
						globalThis.selectNewOrderTaskFunc()
					}, globalThis.taskTime * 1000);
				}
			}, false);
		}
	}


	exports('autoQueryAndPlayTask', obj);
})